package qldc.pm.tiensu.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jfree.util.Log;

import qldc.pm.qtht.dmdc.service.PhuongXaLocalServiceUtil;
import qldc.pm.qtht.dmdc.service.QuanHuyenLocalServiceUtil;
import qldc.pm.tiensu.NoSuchLichSuXoaAnTichException;
import qldc.pm.tiensu.NoSuchTienSuException;
import qldc.pm.tiensu.constants.TrangThaiTienSuEnum;
import qldc.pm.tiensu.dto.ThongKeTienSuDTO;
import qldc.pm.tiensu.model.DoiTuongTienSu;
import qldc.pm.tiensu.model.LichSuXoaAnTich;
import qldc.pm.tiensu.model.PhieuThongTinVeNguoiCoTienSu;
import qldc.pm.tiensu.model.TEMP_DoiTuongTienSu;
import qldc.pm.tiensu.model.TEMP_TienSu;
import qldc.pm.tiensu.model.TienSu;
import qldc.pm.tiensu.service.DoiTuongTienSuLocalServiceUtil;
import qldc.pm.tiensu.service.LichSuXoaAnTichLocalServiceUtil;
import qldc.pm.tiensu.service.TienSuLocalServiceUtil;
import qldc.pm.tiensu.service.base.TienSuLocalServiceBaseImpl;
import qldc.pm.tiensu.service.persistence.TienSuFinderUtil;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.User;

/**
 * The implementation of the tien su local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are
 * added, rerun ServiceBuilder to copy their definitions into the
 * {@link qldc.pm.tiensu.service.TienSuLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security
 * checks based on the propagated JAAS credentials because this service can only
 * be accessed from within the same VM.
 * </p>
 *
 * @author Brian Wing Shun Chan
 * @see qldc.pm.tiensu.service.base.TienSuLocalServiceBaseImpl
 * @see qldc.pm.tiensu.service.TienSuLocalServiceUtil
 */
public class TienSuLocalServiceImpl extends TienSuLocalServiceBaseImpl {
	public TienSu addTienSu(User user, long doiTuongTienSuId, String banAnSo,
			String toaAnXuPhat, String diaChiToaAnXuPhat, Date ngayToaAn,
			String toiDanh, Date ngayPhamToi, boolean xoaAnTich,
			String chuThich, String hinhPhatChinh, String hinhPhatBoSung,
			String nghiaVuDanSu, String anPhi, String moTaTienAn)
			throws SystemException {
		long tienSuId = counterLocalService.increment(TienSu.class.getName());
		TienSu tienSu = createTienSu(tienSuId);

		tienSu.setUserId(user.getUserId());
		tienSu.setUserName(user.getScreenName());
		tienSu.setCreateDate(new Date());
		tienSu.setDoiTuongTienSuId(doiTuongTienSuId);
		tienSu.setToaAnXuPhat(toaAnXuPhat);
		tienSu.setMoTaTienAn(moTaTienAn);
		tienSu.setNgayToaAn(ngayToaAn);
		tienSu.setNgayPhamToi(ngayPhamToi);
		tienSu.setToiDanh(toiDanh);
		tienSu.setXoaAnTich(xoaAnTich);
		tienSu.setChuThich(chuThich);
		tienSu.setHinhPhatChinh(hinhPhatChinh);
		tienSu.setHinhPhatBoSung(hinhPhatBoSung);
		tienSu.setNghiaVuDanSu(nghiaVuDanSu);
		tienSu.setAnPhi(anPhi);
		tienSu.setBanAnSo(banAnSo);
		tienSu = addTienSu(tienSu);

		return tienSu;
	}

	public TienSu updateTienSu(long tienSuId, User user, long doiTuongTienSuId,
			String banAnSo, String toaAnXuPhat, String diaChiToaAnXuPhat,
			Date ngayToaAn, String toiDanh, Date ngayPhamToi,
			boolean xoaAnTich, String chuThich, String hinhPhatChinh,
			String hinhPhatBoSung, String nghiaVuDanSu, String anPhi, String moTaTienAn)
			throws SystemException, PortalException {
		TienSu tienSu = getTienSu(tienSuId);

		tienSu.setUserId(user.getUserId());
		tienSu.setUserName(user.getScreenName());
		tienSu.setModifiedDate(new Date());
		tienSu.setDoiTuongTienSuId(doiTuongTienSuId);
		tienSu.setToaAnXuPhat(toaAnXuPhat);
		// tienSu.setDiaChiToaAnXuPhat(diaChiToaAnXuPhat);
		tienSu.setNgayToaAn(ngayToaAn);
		tienSu.setNgayPhamToi(ngayPhamToi);
		tienSu.setToiDanh(toiDanh);
		tienSu.setXoaAnTich(xoaAnTich);
		tienSu.setChuThich(chuThich);
		tienSu.setHinhPhatChinh(hinhPhatChinh);
		tienSu.setHinhPhatBoSung(hinhPhatBoSung);
		tienSu.setNghiaVuDanSu(nghiaVuDanSu);
		tienSu.setAnPhi(anPhi);
		tienSu.setBanAnSo(banAnSo);
		tienSu.setMoTaTienAn(moTaTienAn);

		tienSu = updateTienSu(tienSu);

		return tienSu;
	}

	public TienSu updateXoaAnTich(User user, long tienSuId, boolean val)
			throws SystemException, PortalException {
		TienSu tienSu = getTienSu(tienSuId);

		tienSu.setUserId(user.getUserId());
		tienSu.setUserName(user.getScreenName());
		tienSu.setModifiedDate(new Date());
		tienSu.setXoaAnTich(val);

		tienSu = updateTienSu(tienSu);
		DoiTuongTienSu doiTuong = DoiTuongTienSuLocalServiceUtil
				.findByDoiTuongTienSuId(tienSu.getDoiTuongTienSuId());
		if (Validator.isNotNull(doiTuong)) {
			TienSu tienSuDangThiHanh = DoiTuongTienSuLocalServiceUtil
					.layTienSuDangThiHanhAnCuaDoiTuong(doiTuong
							.getSoDinhDanhCaNhan());
			if (Validator.isNull(tienSuDangThiHanh)) {
				// Ko con tien su
				doiTuong.setXoaAnTich(true);
				doiTuongTienSuPersistence.update(doiTuong);
			}

		}

		return tienSu;
	}

	public TrangThaiTienSuEnum kiemTraTrangThaiCuaTienSu(long tienSuId)
			throws NoSuchLichSuXoaAnTichException, SystemException {
		TienSu ts = TienSuLocalServiceUtil.findByTienSuId(tienSuId);
		if (Validator.isNotNull(ts)) {
			if (ts.getXoaAnTich()) {
				return TrangThaiTienSuEnum.DA_XOA_AN_TICH;
			} else {
				LichSuXoaAnTich lsx = LichSuXoaAnTichLocalServiceUtil
						.findByTienSuId(tienSuId);
				if (Validator.isNotNull(lsx)) {
					return TrangThaiTienSuEnum.DANG_LAP_YEU_CAU_XOA_AN_TICH;
				} else {
					return TrangThaiTienSuEnum.DANG_THI_HANH_AN;
				}
			}

		}
		return TrangThaiTienSuEnum.DANG_THI_HANH_AN;
	}

	public List<TienSu> findByDoiTuongTienSuId(long doiTuongTienSuId) {
		List<TienSu> tienSus = new ArrayList<TienSu>();

		try {
			tienSus = tienSuPersistence
					.findByDoiTuongTienSuId(doiTuongTienSuId);
		} catch (SystemException e) {
		}

		return tienSus;
	}

	public TienSu findByDoiTuongTienSuId_Latest(long doiTuongTienSuId) {
		TienSu tienSu = null;

		try {
			List<TienSu> tienSus = tienSuPersistence
					.findByDoiTuongTienSuId(doiTuongTienSuId);

			if (Validator.isNotNull(tienSus) && !tienSus.isEmpty()) {
				tienSu = tienSus.get(0);
			}
		} catch (SystemException e) {
		}

		return tienSu;
	}

	public int countByDoiTuongTienSuId(long doiTuongTienSuId)
			throws SystemException {
		return tienSuPersistence.countByDoiTuongTienSuId(doiTuongTienSuId);
	}

	public TienSu findByTienSuId(long tienSuId) {
		TienSu tienSu = null;

		try {
			tienSu = tienSuPersistence.findByPrimaryKey(tienSuId);
		} catch (NoSuchTienSuException e) {
		} catch (SystemException e) {
		}

		return tienSu;
	}

	@SuppressWarnings("null")
	public List<ThongKeTienSuDTO> thongKeTienSuTongQuat(long tinhId,
			long quanHuyenId, Date tuNgay, Date denNgay) {

		List<Object[]> objList;
		try {
			if (quanHuyenId == 0) {
				// If user only select TinhId

				objList = TienSuFinderUtil.findByTKTS_Diaphuong_QuanHuyen(
						tinhId, tuNgay, denNgay);

				return fetchThongKeTienSu(objList, tinhId, quanHuyenId, tuNgay, denNgay);

			} else {
				objList = TienSuFinderUtil.findByTKTS_Diaphuong_PhuongXa(
						tinhId, quanHuyenId, tuNgay, denNgay);

				return fetchThongKeTienSu(objList, tinhId, quanHuyenId, tuNgay, denNgay);

			}

		} catch (SystemException e) {
			e.printStackTrace();
		}
		return null;


	}

	private List<ThongKeTienSuDTO> fetchThongKeTienSu(List<Object[]> objList,
			long tinhId, long quanHuyenId, Date tuNgay, Date denNgay) {
		List<ThongKeTienSuDTO> dsThongKe = new ArrayList<ThongKeTienSuDTO>();
		long quanHuyen = 0, phuongXa = 0;

		try {

			for (int i = 0; i < objList.size(); i++) {
				Object[] obj = objList.get(i);
				ThongKeTienSuDTO thongKe = new ThongKeTienSuDTO();
				thongKe.setIndex(i);
				int hanhChinhId = Integer.valueOf(obj[0].toString());
				String tenHanhChinh;
				if (quanHuyenId <= 0) {
					tenHanhChinh = QuanHuyenLocalServiceUtil.findById(
							hanhChinhId).getTenQuanHuyen();
					quanHuyen = hanhChinhId;
					phuongXa = -1;
				} else {
					tenHanhChinh = PhuongXaLocalServiceUtil.findById(
							hanhChinhId).getTenPhuongXa();
					quanHuyen = quanHuyenId;
					phuongXa = hanhChinhId;
				}
				thongKe.setDonViHanhChinh(tenHanhChinh);
				thongKe.setHoKhau(Integer.valueOf(obj[1].toString()));
				thongKe.setNhanKhau(Integer.valueOf(obj[2].toString()));

				int hoCoTienSu = doiTuongTienSuFinder
						.countDSHoGiaDinhByVungDiaLy_ThoiGianToaAn(tinhId,
								quanHuyen, phuongXa, tuNgay, denNgay);
				int xoaAnTich = doiTuongTienSuFinder.countByDS_XoaAnTich(
						tinhId, quanHuyen, phuongXa, tuNgay, denNgay);
				int trichLuc = ketQuaTrichLucFinder.countDS_TrichLuc(tinhId,
						quanHuyen, phuongXa, tuNgay, denNgay, null, null);
				int tienSu = doiTuongTienSuFinder
						.countDsTienSuByVungDiaLy_ThoiGian(tinhId, quanHuyen,
								phuongXa, tuNgay, denNgay, 1);

				thongKe.setTienSu(tienSu);
				thongKe.setXoaAnTich(xoaAnTich);
				thongKe.setTongHoCoTienSu(hoCoTienSu);
				thongKe.setTrichLuc(trichLuc);
				dsThongKe.add(thongKe);
			}
		} catch (Exception e) {
				Log.error(e.getMessage());
		}

		return dsThongKe;
	}

	public void xoaTienSu(long tienSuId, String undoRedo, String thaoTac, User user) throws PortalException, SystemException {
		TienSu tienSu = deleteTienSu(tienSuId);

		if(Validator.isNotNull(tienSu)) {
			long doiTuongTienSuId = tienSu.getDoiTuongTienSuId();
			DoiTuongTienSu doiTuongTienSu = doiTuongTienSuLocalService.findByDoiTuongTienSuId(doiTuongTienSuId);

			PhieuThongTinVeNguoiCoTienSu phieu = phieuThongTinVeNguoiCoTienSuLocalService.findByTienSuId(tienSuId);

			/*
			 * sava data for undo & redo action
			 */
			saveDataForUndoRedo(undoRedo, thaoTac, tienSu, doiTuongTienSu, phieu);

			phieuThongTinVeNguoiCoTienSuLocalService.deletePhieuThongTinVeNguoiCoTienSu(phieu);

			if(doiTuongTienSuId > 0) {
				List<TienSu> tienSus = findByDoiTuongTienSuId(doiTuongTienSuId);

				if(Validator.isNull(tienSus) || tienSus.isEmpty()) {
					doiTuongTienSuLocalService.deleteDoiTuongTienSu(doiTuongTienSuId);
				} else {
					boolean isXoaAnTichForDoiTuong = true;
					for (TienSu ts : tienSus) {
						if((ts != tienSu) && !ts.isXoaAnTich()) {
							isXoaAnTichForDoiTuong = false;
						}
					}

					if(isXoaAnTichForDoiTuong) {
						doiTuongTienSu.setUserId(user.getUserId());
						doiTuongTienSu.setModifiedDate(new Date());
						doiTuongTienSu.setXoaAnTich(true);

						doiTuongTienSuLocalService.updateDoiTuongTienSu(doiTuongTienSu);
					}
				}
			}
		}
	}

	private void saveDataForUndoRedo(String undoRedo, String thaoTac,
			TienSu tienSu, DoiTuongTienSu doiTuongTienSu,
			PhieuThongTinVeNguoiCoTienSu phieu) throws SystemException {
		TEMP_DoiTuongTienSu doiTuongTienSuTemp = temp_DoiTuongTienSuLocalService.findBySoDinhDanhCaNhan(doiTuongTienSu.getSoDinhDanhCaNhan());

		if (Validator.isNull(doiTuongTienSuTemp)) {
			doiTuongTienSuTemp = temp_DoiTuongTienSuLocalService.addTEMP_DoiTuongTienSu(doiTuongTienSu.getUserId(), doiTuongTienSu.getUserName(),doiTuongTienSu.getSoDinhDanhCaNhan(), doiTuongTienSu.getDoiTuongTienSuId());
		}

		//xoa het nhung tien su truoc do
		temp_PhieuThongTinVeNguoiCoTienSuLocalService.xoaAllTempPhieuByDoiTuongTienSuId(doiTuongTienSuTemp.getDoiTuongTienSuId());
		temp_TienSuLocalService.xoaAllTempTienSu(doiTuongTienSuTemp.getDoiTuongTienSuId());

		TEMP_TienSu temptiensu = temp_TienSuLocalService
				.addTEMP_TienSu(tienSu.getUserId(), tienSu.getUserName(),
						doiTuongTienSuTemp.getDoiTuongTienSuId(),
						tienSu.getBanAnSo(), tienSu.getToaAnXuPhat(), "",
						tienSu.getNgayToaAn(), tienSu.getToiDanh(),
						tienSu.getNgayPhamToi(), tienSu.getXoaAnTich(),
						tienSu.getChuThich(), tienSu.getHinhPhatChinh(),
						tienSu.getHinhPhatBoSung(),
						tienSu.getNghiaVuDanSu(), tienSu.getAnPhi(),
						tienSu.getMoTaTienAn(), undoRedo, thaoTac,
						tienSu.getTienSuId());

		temp_PhieuThongTinVeNguoiCoTienSuLocalService.addTEMPPhieu(
				temptiensu.getTienSuId(), temptiensu.getUserId(),
				temptiensu.getUserName(), phieu.getMaSoHoSoTienSuTuToaAn(),
				phieu.getNguoiTrichLuc(), phieu.getThamPhan(),
				phieu.getSoDinhDanhCaNhan(), phieu.getChuThich(),
				phieu.getNoiTamTruDiaChi(), phieu.getHoTenVoHoacChong(),
				phieu.getHoTenCha(), phieu.getHoTenMe(),
				phieu.getNoiThuongTruDiaChi());
	}
}
